# -*- coding: utf-8 -*-
#该代码为KNN算法的基本实现
from numpy import *
import operator

def create_data_set():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])  #4*2
    labels = ['A','A','B','B']
    #labels = [1,1,2,2]
    return group,labels


def classify0(in_x,data_set,labels,k):
    data_set_size = data_set.shape[0]  #读取矩阵中的长度 shape[0]表示读取矩阵第一维的长度 即行数, shape[1]表示第二维的长度 即列数
    diff_mat = tile(in_x, (data_set_size,1))-data_set #生成一个4*2的目标向量数组 并与样本数组做减法
    sq_diff_mat = diff_mat**2  #对结果做平方
    sq_distances=sq_diff_mat.sum(axis=1)  #加入axis=1以后就是将一个矩阵的每一行向量相加
    distances=sq_distances**0.5  #对结果开根号
    sorted_dist_indices=distances.argsort() #将distances从小到大排列，提取其对应的index(索引)，然后输出到sortedDistIndices
    class_count={}#定义字典
    for i in range(k):
        vote_label=labels[sorted_dist_indices[i]]
        class_count[vote_label]=class_count.get(vote_label,0)+1  #classCount.get(voteLabel,0) 获取字典标签voteLabel的值 如果没有默认返回0
        sort_class_count = sorted(class_count.items(),key=operator.itemgetter(1),reverse=True) #通过对classCount所有项的第二个域(即标签出现的次数)进行降序排列
    return sort_class_count[0][0] #返回字典第一项的第一个域（即标签）


if __name__=='__main__':
    inX=[-1,1]
    group,labels=create_data_set()
    result=classify0(inX,group,labels,3)
    print (result)
